#ifndef _GrupoFiguras_h
#define _GrupoFiguras_h
#include <iostream>
#include <vector>
#include "IDibujable.h"
#include "Figura2D.h"
#include "ExcepcionSVG.h"
using namespace std;

/** \file GrupoFiguras.h
* \brief Clase GrupoFiguras
*
* Defincion de clase GrupoFiguras.
* JAVIER ANTON DIAZ DNI:48629698Q
* STANISLAV LITVINENKO DNI:02062226T
*/


/** \brief Clase GrupoFiguras.
 *
 * Clase que define los métodos y funciones asociados a esta.
 */
class GrupoFiguras: public IDibujable{

	public:
		/** \brief Constructor de objeto GrupoFiguras.
		*
		* Pasamos un vector de punteros a Figura2D y una descripcion del grupo para crear el objeto de GrupoFiguras.
		* \param figuras de tipo vector punteros Figura2D.
		* \param descr de tipo string
		*/
		GrupoFiguras(const vector<Figura2D*>, string descr="");

		/** \brief Constructor de copia.
		*
		* Pasado un objeto crea uno igual a este sin alterarlo.
		* \param grupo Un objeto de tipo const GrupoFiguras&.
		*/
		GrupoFiguras(const GrupoFiguras&);

		/** \brief Destructor de objetos GrupoFiguras.
		*
		* Se ejecuta cuando hace falta destruir un objeto.
		*/
		~GrupoFiguras();

		/** \brief Sobrecarga del operador "=".
		*
		* Mediante este método, copiamos el contenido de un objeto GrupoFiguras a el que queramos.
		* \param g Tipo const GrupoFiguras.
		* \return El método devuelve un objeto GrupoFiguras.
		*/
		GrupoFiguras& operator=(const GrupoFiguras&);

		/** \brief setDescripcion().
		*
		* Este método nos permite modificar el valor de descripcion del objeto que lo llame.
		* \param is descripcion.
		* \return El método no devuelve nada.
		*/
		void setDescripcion(string is);

		/** \brief getDescripcion.
		*
		* Este método devuelve el valor de la variable descripcion de la clase.
		*
		* \return El método devuelve un string con la descripcion.
		*/
		string getDescripcion() const;

		/** \brief getOrigen.
		*
		* Este método devuelve el valor del atributo centro de la clase Figura2D.
		*
		* \return El método devuelve un objeto Coordenada.
		*/
		Coordenada getOrigen() const;

		/** \brief pintar.
		*
		* Este método recibe un parámetro os tipo ostream mediante el cual efectúa la salida en el formato que queremos.
		* \param os tipo ostream&.
		* \return El método no devuelve nada.
		*/
		void pintar(ostream&) const;

		/** \brief puedoPintarme().
		*
		* Este metodo comprueba que la figura no pertenezca a ningun grupo y devuelve si es cierto o falso.
		* \return El método no devuelve nada.
		*/
		bool puedoPintarme() const;

		/** \brief leeEntrada().
		*
		* Este método procesa la linea del fichero para rellenar los datos de un grupo de figuras.
		* \param is flujo de entrada.
		* \return El método no devuelve nada.
		*/
		void leeEntrada(istream&);

		/** \brief getFigura().
		*
		* Este metodo nos devuelve una referencia al objeto en la posicion i que le pasemos.
		*
		* \param i El identificador de la figura
		* \return El método devuelve una referencia al objeto.
		*/
		const Figura2D& getFigura(int) const;

		/** \brief clonar().
		*
		* Este método crea una figura GrupoFiguras clonica al original.
		* \return El método devuelve un puntero a ese objeto clonico.
		*/
		GrupoFiguras* clonar() const;

		/** \brief duplicar().
		*
		* Este método duplicar la figura con la Coordenada que recibe.
		* \param nuevoOrigen Coordenada de la figura duplicada
		* \return El método devuelve un puntero a la figura duplicada.
		*/
		GrupoFiguras* duplicar(const Coordenada &);

		/** \brief mover().
		*
		* Este metodo desplaza el porigen de una figura a otra coordenada devolviendo la coordenada antigua.
		*
		* \param nuevoOrigen El nuevo origen al que desplazar
		* \return El método devuelve la Coordenada antigua
		*/
		Coordenada mover(const Coordenada&);

		/** \brief escalar().
		*
		* Este método eleva todos los valores alterables de las figuras del grupo.
		* \param porcentaje cuanto debe de ser elevado el radio.
		* \return El método no devuelve nada.
		*/
		void escalar(float porcentaje=100.0);

		/** \brief getNumFiguras().
		*
		* Este método devuelve la cantidad de figuras que hay en el grupo.
		* \return Cantidad de figuras
		*/
		int getNumFiguras();

	private:
		/** \brief Variable tipo string "descripcion";
		 *
		 *	La variable descripcion representa la descripcion del grupo.
		 */
		string descripcion;

		/** \brief Variable figs, vector dinámico de objetos Circulo y/o Rectangulo.
		 *
		 * Esta variable contiene los objetos tipo Circulo y/o Rectangulo que el programa necesite almacenar para trabajar con ellos.
		 */
		vector<Figura2D*>figs;


};

#endif
